/*     */ package com.zimbra.cs.session;
/*     */ 
/*     */ import com.google.common.base.Objects;
/*     */ import com.google.common.base.Objects.ToStringHelper;
/*     */ import com.zimbra.common.localconfig.KnownKey;
/*     */ import com.zimbra.common.localconfig.LC;
/*     */ import com.zimbra.common.service.ServiceException;
/*     */ import com.zimbra.common.soap.Element;
/*     */ import com.zimbra.cs.account.Account;
/*     */ import com.zimbra.cs.mailbox.Mailbox;
/*     */ import com.zimbra.cs.mailbox.MailboxLock;
/*     */ import com.zimbra.cs.mailbox.MailboxManager;
/*     */ import java.text.SimpleDateFormat;
/*     */ import java.util.Date;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public abstract class Session
/*     */ {
/*     */   protected final String mAuthenticatedAccountId;
/*     */   protected final String mTargetAccountId;
/*     */   private final Type mSessionType;
/*     */   private final long mCreationTime;
/*     */   private String mSessionId;
/*     */   protected volatile Mailbox mailbox;
/*     */   private long mLastAccessed;
/*     */   private boolean mCleanedUp;
/*     */   private boolean mIsRegistered;
/*     */   private boolean mAddedToCache;
/*     */   public static final int OPERATION_HISTORY_LENGTH = 6;
/*     */   public static final int OPERATION_HISTORY_TIME = 10000;
/*     */   
/*     */   public static enum Type
/*     */   {
/*  58 */     NULL(0, 0), 
/*  59 */     SOAP(1, LC.zimbra_session_limit_soap.intValue()), 
/*  60 */     IMAP(2, Math.max(0, LC.zimbra_session_limit_imap.intValue())), 
/*  61 */     ADMIN(3, LC.zimbra_session_limit_admin.intValue()), 
/*  62 */     WIKI(4, 0), 
/*  63 */     SYNCLISTENER(5, LC.zimbra_session_limit_sync.intValue()), 
/*  64 */     WAITSET(6, 0);
/*     */     
/*     */     private final int mIndex;
/*     */     
/*  68 */     private Type(int index, int maxPerAccount) { this.mIndex = index;
/*  69 */       this.mMaxPerAccount = maxPerAccount;
/*     */     }
/*     */     
/*     */ 
/*     */     private final int mMaxPerAccount;
/*     */     public final int getIndex()
/*     */     {
/*  76 */       return this.mIndex;
/*     */     }
/*     */     
/*     */     public final int getMaxPerAccount() {
/*  80 */       return this.mMaxPerAccount;
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */   public static abstract class ExternalEventNotification
/*     */   {
/*     */     public abstract void addElement(Element paramElement);
/*     */     
/*     */ 
/*     */     public boolean canAccess(Account account)
/*     */     {
/*  92 */       return true;
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public Session(String accountId, Type type)
/*     */   {
/* 101 */     this(accountId, accountId, type);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Session(String authId, String targetId, Type type)
/*     */   {
/* 113 */     this.mAuthenticatedAccountId = authId;
/* 114 */     this.mTargetAccountId = (targetId == null ? authId : targetId);
/* 115 */     this.mSessionType = type;
/* 116 */     this.mCreationTime = System.currentTimeMillis();
/* 117 */     this.mLastAccessed = this.mCreationTime;
/* 118 */     this.mSessionId = SessionCache.getNextSessionId(this.mSessionType);
/*     */   }
/*     */   
/*     */   public Type getType() {
/* 122 */     return this.mSessionType;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Session register()
/*     */     throws ServiceException
/*     */   {
/* 132 */     if (this.mIsRegistered) {
/* 133 */       return this;
/*     */     }
/*     */     
/* 136 */     if (isMailboxListener()) {
/* 137 */       Mailbox mbox = this.mailbox = MailboxManager.getInstance().getMailboxByAccountId(this.mTargetAccountId);
/*     */       
/*     */ 
/* 140 */       if (mbox != null) {
/* 141 */         mbox.addListener(this);
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 146 */     if (isRegisteredInCache()) {
/* 147 */       addToSessionCache();
/*     */     }
/*     */     
/* 150 */     this.mIsRegistered = true;
/*     */     
/* 152 */     return this;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Session unregister()
/*     */   {
/* 163 */     Mailbox mbox = this.mailbox;
/* 164 */     assert ((mbox == null) || (mbox.lock.isWriteLockedByCurrentThread()) || (!Thread.holdsLock(this)));
/*     */     
/* 166 */     if ((mbox != null) && (isMailboxListener())) {
/* 167 */       mbox.removeListener(this);
/* 168 */       this.mailbox = null;
/*     */     }
/*     */     
/* 171 */     removeFromSessionCache();
/*     */     
/* 173 */     this.mIsRegistered = false;
/*     */     
/* 175 */     return this;
/*     */   }
/*     */   
/*     */   protected boolean isRegistered() {
/* 179 */     return this.mIsRegistered;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   protected abstract boolean isMailboxListener();
/*     */   
/*     */ 
/*     */ 
/*     */   protected abstract boolean isRegisteredInCache();
/*     */   
/*     */ 
/*     */ 
/*     */   public final void encodeState(Element parent)
/*     */   {
/* 195 */     doEncodeState(parent);
/*     */   }
/*     */   
/*     */   protected void doEncodeState(Element parent) {}
/*     */   
/*     */   protected void addToSessionCache() {
/* 201 */     SessionCache.registerSession(this);
/* 202 */     this.mAddedToCache = true;
/*     */   }
/*     */   
/*     */   protected void removeFromSessionCache() {
/* 206 */     if (this.mAddedToCache) {
/* 207 */       SessionCache.unregisterSession(this);
/* 208 */       this.mAddedToCache = false;
/*     */     }
/*     */   }
/*     */   
/*     */   public boolean isAddedToSessionCache()
/*     */   {
/* 214 */     return this.mAddedToCache;
/*     */   }
/*     */   
/*     */   public String getSessionId()
/*     */   {
/* 219 */     return this.mSessionId;
/*     */   }
/*     */   
/*     */   public String getQualifiedSessionId()
/*     */   {
/* 224 */     return SessionCache.qualifySessionId(this.mSessionId);
/*     */   }
/*     */   
/*     */ 
/*     */   final Session testSetSessionId(String sessionId)
/*     */   {
/* 230 */     this.mSessionId = sessionId;
/* 231 */     return this;
/*     */   }
/*     */   
/*     */ 
/*     */   public Type getSessionType()
/*     */   {
/* 237 */     return this.mSessionType;
/*     */   }
/*     */   
/*     */ 
/*     */   protected abstract long getSessionIdleLifetime();
/*     */   
/*     */ 
/*     */   public Mailbox getMailbox()
/*     */   {
/* 246 */     return this.mailbox;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public abstract void notifyPendingChanges(PendingModifications paramPendingModifications, int paramInt, Session paramSession);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public void notifyExternalEvent(ExternalEventNotification extra) {}
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   final void doCleanup()
/*     */   {
/* 271 */     if (this.mCleanedUp) {
/* 272 */       return;
/*     */     }
/*     */     try
/*     */     {
/* 276 */       cleanup();
/* 277 */       unregister();
/*     */     } finally {
/* 279 */       this.mCleanedUp = true;
/*     */     }
/* 281 */     this.mailbox = null;
/*     */   }
/*     */   
/*     */   protected abstract void cleanup();
/*     */   
/*     */   public long getLastAccessTime() {
/* 287 */     return this.mLastAccessed;
/*     */   }
/*     */   
/*     */   public long getCreationTime() {
/* 291 */     return this.mCreationTime;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public void updateAccessTime()
/*     */   {
/* 299 */     SessionCache.lookup(this.mSessionId, this.mAuthenticatedAccountId);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   void sessionCacheSetLastAccessTime()
/*     */   {
/* 307 */     this.mLastAccessed = System.currentTimeMillis();
/*     */   }
/*     */   
/*     */   public boolean accessedAfter(long otherTime) {
/* 311 */     return this.mLastAccessed > otherTime;
/*     */   }
/*     */   
/*     */ 
/*     */   public String getAuthenticatedAccountId()
/*     */   {
/* 317 */     return this.mAuthenticatedAccountId;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   public String getTargetAccountId()
/*     */   {
/* 324 */     return this.mTargetAccountId;
/*     */   }
/*     */   
/*     */   public boolean isDelegatedSession() {
/* 328 */     return !this.mAuthenticatedAccountId.equalsIgnoreCase(this.mTargetAccountId);
/*     */   }
/*     */   
/*     */   public String toString()
/*     */   {
/* 333 */     return Objects.toStringHelper(this).add("sessionId", this.mSessionId).add("accountId", this.mAuthenticatedAccountId).add("lastAccessed", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS").format(new Date(this.mLastAccessed))).toString();
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/session/Session.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */